import express from 'express';
import moment from 'moment';
import wyApi from '../../lib/wyapi'; // 维易接口API
import { Order, User } from '../../modal/index'; // 数据库实体类
import { statusList, sequelizeStatus } from '../../common/status'; // 状态码对照
import { checkPermission, addMoney } from '../../utils/utils'; // 工具类
import messageApi from '../../lib/messageapi'; // 消息通知相关API
import baseDao from '../../lib/baseDao'; // 用于获取实例化的sequelize
import CONFIG from '../../../config/config.config'; // 全局配置

const router = express.Router();

router.get('/', async function (Request, Response, next) {
  let param = Request.query
  // Order.Modal.sync();
  // param.interval时间间隔，单位：分钟
  let addNumber = 0 // 新增订单数量
  let goldSum = 0 // 积分总计

  // let test = "2019-11-11 01:00:00"

  let orderParam = {
    page_no: 1,
    page_size: 100, // 默认值20，最大值100
    vekey: CONFIG.vekey,
    start_time: moment(new Date() - param.interval * 60 * 1000).format('YYYY-MM-DD HH:mm:ss'),
    end_time: moment(new Date()).format('YYYY-MM-DD HH:mm:ss'),
    // start_time: moment(new Date(test).valueOf() - param.interval * 10 * 1000).format('YYYY-MM-DD HH:mm:ss'), // !!!!!调试!!!!!
    // end_time: moment(new Date(test).valueOf() + param.interval * 10 * 1000).format('YYYY-MM-DD HH:mm:ss'), // !!!!!调试!!!!!
    // start_time: '2019-10-19 06:59:59', // !!!!!调试!!!!!
    // end_time: '2019-10-19 07:59:59', // !!!!!调试!!!!!
    query_type: param.queryType, // 查询类型：1-按照订单创建时间查询，2-按照订单付款时间查询，3-按照订单结算时间查询。
  }
  wyApi.orderDetail(orderParam).then(async res => {
    if (res.error !== '0') {
      // 接口返回出错信息
      console.log(res.err)
      messageApi.serverJiang({
        text: `${CONFIG.appNameC}订单查询出错`,
        desp: res.msg
      }).then(() => {
        Response.status(300).send({ message: res.msg });
      })
    } else if (!res.data.results.publisher_order_dto) {
      // 当前时间段订单为空
      Response.status(300).send({ message: '当前时间段订单为空' });
    } else {
      let orders = res.data.results.publisher_order_dto;
      for (let i = 0; i < orders.length; i++) {
        let item = orders[i]
        User.Modal.findAll({
          where: {
            tradeParentId: item.trade_parent_id.substring(12,18),
          },
          raw: true, // 返回标准json格式
        }).then(async res => {
          let insertItem = {}
          if(res && res.length > 0){
            item.user_id = res[0].id
            // 此处插入订阅模板
          }
          
          insertItem = {
            userId: item.user_id, // 所属用户ID
            tradeParentId: item.trade_parent_id, // 订单编号
            tradeId: item.trade_id, // 订单商品编号
            itemTitle: item.item_title, // 商品名
            sellerShopTitle: item.seller_shop_title, // 店铺名
            goodsId: item.item_id, // 商品ID
            itemImg: item.item_img, // 商品主图
            itemNum: item.item_num, // 商品数量
            itemPrice: item.item_price, // 商品单价
            pubSharePreFee: item.pub_share_pre_fee, // 付款预估收入
            alipayTotalPrice: item.alipay_total_price, // 买家拍下付款的金额（不包含运费金额）
            payPrice: item.pay_price, // 付款金额
            totalCommissionFee: item.total_commission_fee, // 佣金金额
            itemCategoryName: item.item_category_name, // 商品所属的一级类目
            tkStatus: item.tk_status, // 淘宝客订单状态3：订单结算，12：订单付款， 13：订单失效，14：订单成功
            refundTag: item.refund_tag, // 维权标签
            tkCreateTime: item.tk_create_time, // 订单创建的时间
            tbPaidTime: item.tb_paid_time, // 订单在淘宝拍下付款的时间
            tkEarningTime: item.tk_earning_time, // 订单确认收货后且商家完成佣金支付的时间
            clickTime: item.click_time, // 通过推广链接达到商品、店铺详情页的点击时间
            adzoneName: item.adzone_name, // 推广位管理下的自定义推广位名称
            adzoneId: item.adzone_id, // 推广位管理下的推广位名称对应的ID
            terminalType: item.terminal_type, // 成交平台：无线/PC
            tkEarningTime: item.tk_earning_time, // 佣金结算时间
          }
          await upsertOrder(insertItem, Response).then(res => {
            // res为true则新增，false则更新
            addNumber += 1
            // addGold += Number(item.total_commission_fee)
          })
          
        }).catch(err => {
          console.log(err)
          Response.status(500).send({ message: sequelizeStatus[err.name] || statusList[500] || err.name });
        });
      }
      
      if(Number(param.queryType) === 3){ // 只有查询结算订单才进行下面的操作
        Order.Modal.findAll({
          where: {
            status: 0,
            tkStatus: 3,
          },
          raw: true, // 返回标准json格式
        }).then(async orders => {
          if(orders && orders.length > 0){
            for (let i = 0; i < orders.length; i++) {
              // 此处开始锁定事务
              const transaction = await baseDao.sequelize.transaction() // 事务
              await settleGold(orders, i, transaction, Response).then(res => {
                if(res){
                  goldSum += Number(res)
                }
              })
              if(i === orders.length - 1){
                Response.json({
                  data: {
                    addNumber: addNumber,
                    goldSum: goldSum,
                  },
                  message: "success"
                });
              }
            }
          } else{
            Response.json({
              data: {
                data: "存在订单刷新，但未发生加款操作",
              },
              message: "success"
            });
          }
        }).catch(err => {
          console.log(err)
          Response.status(500).send({ message: sequelizeStatus[err.name] || statusList[500] || err.name });
        });
      } else {
        Response.json({
          data: {
            data: "订单入库处理完毕，查询非结算订单不进行结算操作",
          },
          message: "success"
        });
      }
      
      
    }
  })
});

function upsertOrder(order, Response) {
  // 订单入库
  return new Promise((resolve, reject) => {
    Order.Modal.upsert(order).then(res => {
      resolve(res)
    }).catch(err => {
      console.log(err)
      Response.status(500).send({ message: sequelizeStatus[err.name] || statusList[500] || err.name });
    });
  })
}

function settleOrder(tradeParentId, Response) {
  // 处理订单结算
  return new Promise((resolve, reject) => {
    User.Modal.findAll({
      where: {
        tradeParentId: tradeParentId.substring(12,18),
      },
      raw: true, // 返回标准json格式
    }).then(res => {
      if(res && res.length > 0){
        resolve(res[0])
      } else {
        resolve(null)
      }
    }).catch(async err => {
      console.log(err)
      Response.status(500).send({ message: sequelizeStatus[err.name] || statusList[500] || err.name });
    });
  })
}

function settleGold(orders, i, transaction, Response) {
  // 等待事务提交
  return new Promise((resolve, reject) => {
    let order = orders[i]
    settleOrder(order.tradeParentId, Response).then(async user => {
      if(user){
        if(order.totalCommissionFee > 30){ // 结算金额超过30阈值预警!!!
          messageApi.serverJiang({
            text: `${CONFIG.appNameC}结算订单金额超过30元`,
            desp: `结算金额：${order.tradeParentId}元，用户ID：${order.userId}`
          })
        }
        let addGold = Math.ceil(order.totalCommissionFee * 10 * CONFIG.levelEarning * user.level)
        Order.Modal.update({
          userId: user.id,
          status: 1,
          returnGold: addGold,
        }, {
          where: {
            id: order.id,
          },
          transaction: transaction
        }).then(async res => {
          // 加款操作
          let addParam = {
            userId: user.id,
            title: '小程序转链下单返还积分',
            addGold: addGold, // 要加的积分
          }
          await addMoney(addParam, transaction, Response).then(async res => {
            console.log('增加成功，当前积分：', res)
            // goldSum += Number(addGold)
          })
          
          await transaction.commit() // 提交事务
          resolve(addGold)
        }).catch(async err => {
          console.log(err)
          await transaction.rollback() // 回滚
          Response.status(500).send({ message: sequelizeStatus[err.name] || statusList[500] || err.name });
        });
      }else{
        await transaction.commit() // 提交事务
        resolve(0) // 该笔订单尚未被用户绑定
      }
      
    })
  })
}

module.exports = router;